X-Amzn-Trace-Id を使用して Application Load Balancer リクエストをトレースしてみた

X-Amzn-Trace-Id を使用して Application Load Balancer リクエストをトレースしてみた

Clock Icon2025.01.14

はじめに

テクニカルサポートの 片方 です。
今回は ALB とバックエンド側のターゲットの双方で同一のリクエストに関するログを参照しているか否か、判断する方法をご紹介します。

方法について

同一のリクエストであるかを確実に確認する方法としては、ALB が発行するトレース ID の情報をご利用いただく方法がございます。
ALB はターゲットに対してリクエストを送信する際に X-Amzn-Trace-Id ヘッダーを付与し、また、アクセスログを記録する際には X-Amzn-Trace-Id ヘッダーの値を trace_id のフィールドに記録します。
これにより、ターゲット側のログでも X-Amzn-Trace-Id ヘッダーの情報を出力することで、ALB およびターゲットの双方で同一のリクエストに関するログを参照しているかを確認可能です。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-log-entry-format

"trace_id" X-Amzn-Trace-Id ヘッダーのコンテンツ (二重引用符で囲まれます)。

前提

今回バックエンド側のウェブサーバーは Apache を利用しました。(Amazon Linux 2023 で起動)
ALB のアクセスログ取得方法や、EC2 に Apache インストールする方法などは省かせていただきます。
設定方法が判らない場合は、弊社ブログをご参考ください。

※ ALB アクセスログ
https://dev.classmethod.jp/articles/alb_accesslog_enable/

※ ALB + EC2(Apache)
https://dev.classmethod.jp/articles/access-apache-page-via-alb/

やってみた

ALB のアクセスログを有効化すれば、自動的に X-Amzn-Trace-Id ヘッダーの値を trace_id のフィールドに記録します。
そのため、バックエンド側の Apache ウェブサーバー側の設定を行えば完了です。

https://repost.aws/ja/knowledge-center/trace-elb-x-amzn-trace-id

お好みの方法で EC2(Apache)に SSH 接続します。
任意のテキストエディタで Apache 設定ファイルを開きます。

$ sudo vi /etc/httpd/conf/httpd.conf

LogFormat セクションで、次のようにオプション %{X-Amzn-Trace-Id}i を追加します。

LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Amzn-Trace-Id}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{X-Amzn-Trace-Id}i\"" combined

01

Apache サービスを再起動して、次のように変更を適用します。

$ sudo systemctl restart httpd

これで設定は終了です。簡単ですね。

確認してみた

適当にバックエンド側へアクセスを行った後に、ALB 側のアクセスログを確認します。

※ 一部マスクします

http 2025-01-14T08:08:16.668430Z app/Test/cc8ada41cxxxxxxx xxx.1xx.87.xx3:51767 10.0.11.218:80 0.000 0.001 0.000 304 304 557 222 "GET http://test-200xxxxxxx.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" - - arn:aws:elasticloadbalancing:ap-northeast-1:xxxxxxxxxxxx:targetgroup/test-sg/9a5191xxxxxxxxxx "Root=1-67861b70-26f22945248e068a1c4cad1e" "-" "-" 0 2025-01-14T08:08:16.667000Z "forward" "-" "-" "10.0.11.218:80" "304" "-" "-" TID_7ea55c79787470488258e4e381fccaa3

trace_id として "Root=1-67861b70-26f22945248e068a1c4cad1e" が取得されています。

バックエンド側のログを確認します。

$ sudo cat /var/log/httpd/access_log
(略)
10.0.5.74 - - [14/Jan/2025:08:08:16 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" "Root=1-67861b70-26f22945248e068a1c4cad1e"
10.0.19.48 - - [14/Jan/2025:08:08:20 +0000] "GET / HTTP/1.1" 200 120 "-" "ELB-HealthChecker/2.0" "-"

02

ターゲット側のログでも X-Amzn-Trace-Id ヘッダーの情報を出力できていますね。
また、trace_id として同一の "Root=1-67861b70-26f22945248e068a1c4cad1e" が出力されています。成功です!

まとめ

エラーおよびリクエストの遅延調査、パフォーマンス分析に役立つかと思います。
本ブログが誰かの参考になれば幸いです。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.